﻿#pragma once

#include <string>
#include <vector>

#include "acis/curve.hxx"
#include "acis/dcl_cstr.h"
#include "acis/intrapi.hxx"

/**
 * @brief 自动生成的基本体（包括体、面、边）列表
 */
enum BASIC_ENTITIES {
	E_CUBE,              // 立方体
	E_SPHERE,            // 球体
	E_CYLINDER,          // 圆柱体
	E_TORUS,             // 圆环体
	E_CONE,              // 圆锥体
	E_PRISM,             // 多棱锥
	E_PYRAMID,           // 金字塔
	E_WIGGLE,            // 摆动体
	E_PLANE,             // 矩形面
	E_PPLANE,            // 平行四边形面
	E_CPLANE,            // 圆形面
	E_SPHERES,           // 球面
	E_PSPHERES,          // 部分球面
	E_CONIC_SIDE,        // 圆锥面
	E_CYLINDER_SIDE,     // 圆柱面
	E_PCONIC,            // 部分圆锥面
	E_TORUSS,            // 完整圆环面
	E_PTORUSS,           // 部分圆环面
	E_LAWS,              // 公式面
	E_BSPLINES_CTRLPTS,  // 控制点b样条面
	E_BSPLINES_FIT,      // 拟合b样条面
	E_BSPLINES_INTRP,    // 插值b样条面
	E_LINE,              // 直线
	E_ARC,               // 圆弧
	E_ELLIPSE,           // 椭圆
	E_CONIC,             // 二次线
	E_HELIX,             // 螺旋线
	E_SPIRAL,            // 阿基米德螺旋线
	E_SPRING,            // 弹簧线
	E_LAWC,              // 方程线
	E_BSPLINE_CTRLPTS,   // 控制点b样条
	E_BSPLINE_FIT,       // 拟合b样条
	E_BSPLINE_INTRP,     // 插值b样条
	E_BEZIER,            // 贝塞尔
	E_ALL                // 通配符，用于记录批测试跳过信息
};

static std::vector<std::string> entity_name_en = { "E_CUBE",   "E_SPHERE",           "E_CYLINDER",     "E_TORUS",           "E_CONE",        "E_PRISM",         "E_PYRAMID", "E_WIGGLE", "E_PLANE",
												  "E_PPLANE", "E_CPLANE",           "E_SPHERES",      "E_PSPHERES",        "E_CONIC_SIDE",  "E_CYLINDER_SIDE", "E_PCONIC",  "E_TORUSS", "E_PTORUSS",
												  "E_LAWS",   "E_BSPLINES_CTRLPTS", "E_BSPLINES_FIT", "E_BSPLINES_INTRP",  "E_LINE",        "E_ARC",           "E_ELLIPSE", "E_CONIC",  "E_HELIX",
												  "E_SPIRAL", "E_SPRING",           "E_LAWC",         "E_BSPLINE_CTRLPTS", "E_BSPLINE_FIT", "E_BSPLINE_INTRP", "E_BEZIER" };

/**
 * @brief 获得基本体，用于测试算法
 * @param index 第index个基本体
 * @param engine 生成基本体采用的引擎
 * @return 实体指针，可能为nullptr
 */
DECL_CSTR BODY* getBody(BASIC_ENTITIES index);

DECL_CSTR FACE* getFace(BASIC_ENTITIES index);

DECL_CSTR EDGE* getEdge(BASIC_ENTITIES index);

/**
 * @brief 判断一个边界为uv_loop的面是否合法
 *
 * @details 检查由分割环构成的面构成是否合法，有且仅能有一对分割环
 *
 * @param f 指向FACE结构体的指针，表示待判断的面
 *
 * @return 如果面合法，则返回true；否则返回false
 */
DECL_CSTR bool is_uv_face_legal(const FACE* f);

